package com.wdciti.sccp.iot.position.service;


import com.wdciti.sccp.iot.position.model.MeasureDataValue;
import com.wdciti.sccp.iot.position.model.MeasureDataSet;
import lombok.NonNull;

import java.util.List;
import java.util.Map;

public interface PositionDataService {

    List<MeasureDataValue> getLastData(String path);

    List<MeasureDataValue> getLastData(@NonNull String path, long timeStamp, long timeout);



    /**
     * 查询某个序列的最新数据（针对当前时间）
     * @param  path 物模型序列号（简称序列号）。
     * @param  keys 物联网信息模型属性名集合，（简称属性集合）
     * @return MeasureDataValue 物联网信息模型pvt(属性、值、时间戳)三元复合体。
     */
    List<MeasureDataValue> getLastData(String path,List<String> keys);

    /**
     * 查询一个序列在距离给定时间点之前的最新的一条数据。
     * @param path 序列名
     * @param keys 属性集合
     * @param timestamp 时间点
     * @param timeout 超时时间（毫秒）
     * @return MeasureDataValue数组结果集
     */
    List<MeasureDataValue> getLastData(String path, List<String> keys, long timestamp, long timeout);

    /**
     *
     * @param paths
     * @param keys
     * @return
     */
    Map<String, List<MeasureDataValue>> getLastDataFromPaths(List<String> paths, List<String> keys);

    /**
     *
     * @param paths 序列名
     * @param keys 属性集合
     * @param timestamp 时间点
     * @param timeout 超时时间（毫秒）
     * @return <path,MeasureDataValue数组> 结果集
     */
    Map<String, List<MeasureDataValue>> getLastDataFromPaths(List<String> paths, List<String> keys, long timestamp, long timeout);

    /**
     * 询序列在某个精确时间点的数据（毫秒），没有则返回空数组。
     * @param path 序列名
     * @param timeStamp 时间点
     * @return MeasureDataValue数组集合
     */
    List<MeasureDataValue> getDataAtTime(@NonNull String path, long timeStamp);

    /**
     * 查询序列在某个精确时间点的数据（毫秒），没有则返回空数组。
     * @param path 序列名
     * @param keys 属性集合
     * @param timeStamp 时间点
     * @return MeasureDataValue数组集合
     */
    List<MeasureDataValue> getDataAtTime(@NonNull String path, List<String> keys, long timeStamp);

    /**
     *
     * @param path 序列名
     * @param keys 属性集合
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 翻页行数
     * @param offset 起始页数
     * @return MeasureDataSet 结果集
     */
    MeasureDataSet getRawData(@NonNull String path, @NonNull List<String> keys, long startTime, long endTime, int limit, int offset);

    /**
     * 查询序列在某个时间段的值(注意：结果集合中实际的时间点的序列仍然按时间顺序排序。)
     *
     * @param path 序列名
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param limit     最大行数
     * @param offset    起始页数
     * @return MeasureDataSet 结果集合
     */
    MeasureDataSet getRawData(String path, long startTime, long endTime, int limit, int offset);

    /**
     *查询序列在某个时间段的值(注意：结果集合中实际的时间点的序列仍然按时间顺序排序,最大支持1000条数据)
     *
     * @param path 序列名
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return MeasureDataSet 结果集合
     */
    default MeasureDataSet getRawData(String path, long startTime, long endTime){
        return getRawData(path,startTime,endTime,0,1000);
    }

}
